package com.wang.jmonkey.modules.task.api;

import cn.hutool.core.util.StrUtil;
import com.wang.jmonkey.common.annotation.Log;
import com.wang.jmonkey.common.result.HttpPageResult;
import com.wang.jmonkey.common.result.HttpResult;
import com.wang.jmonkey.modules.task.model.entity.SystemTaskEntity;
import com.wang.jmonkey.modules.task.model.query.SystemTaskQuery;
import com.wang.jmonkey.modules.task.service.SystemTaskService;
import org.quartz.CronExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 定时任务配置表(SystemTask)表控制层
 *
 * @author HeJiawang
 * @since 2021-07-26 16:51:30
 */
@RestController
@RequestMapping("/")
public class SystemTaskApi {

    /**
     * 服务对象
     */
    @Autowired
    private SystemTaskService service;


    /**
     * 分页查询信息
     * @param query 分页查询条件
     * @return 定时任务信息
     */
    @Log("定时任务管理——分页查询信息")
    @GetMapping(value = "/page")
    public HttpPageResult<SystemTaskEntity> page(SystemTaskQuery query) {
        return new HttpPageResult<>(service.page(query));
    }

    /**
     * 校验任务类是否可用
     *  1、任务类存在
     *  2、任务类未被使用
     * @param task task
     * @return true 存在并未被使用，false不存在或已被使用
     */
    @PostMapping(value = "/checkClassName")
    public HttpResult<Void> checkClassName(@RequestBody SystemTaskEntity task) {
        return new HttpResult<Void>().setSuccess(service.checkClassName(task));
    }

    /**
     * 验证定时任务规则表达式
     * @param rule rule
     * @return Boolean true 通过； false不通过
     */
    @GetMapping(value = "/checkRule")
    public HttpResult<Void> checkRule(String rule) {
        return new HttpResult<Void>().setSuccess(StrUtil.isNotEmpty(rule) && CronExpression.isValidExpression(rule));
    }

    /**
     * 新增定时任务
     * @param task task
     * @return true 新增成功
     */
    @Log("定时任务管理———新增")
    @PostMapping(value = "/save")
    public HttpResult<Void> save(@RequestBody @Validated SystemTaskEntity task) {
        return new HttpResult<Void>().setSuccess(service.save(task));
    }

    /**
     * 修改定时任务
     * @param task task
     * @return true 修改成功
     */
    @Log("定时任务管理——修改")
    @PutMapping(value = "/update")
    public HttpResult<Void> update(@RequestBody @Validated SystemTaskEntity task) {
        return new HttpResult<Void>().setSuccess(service.updateById(task));
    }

    /**
     * 删除定时任务
     * @param id task id
     * @return true 删除成功
     */
    @Log("定时任务管理——删除")
    @DeleteMapping(value = "/remove/{id}")
    public HttpResult<Void> remove(@PathVariable Long id) {
        return new HttpResult<Void>().setSuccess(service.removeById(id));
    }

    /**
     * 暂停定时任务
     * @param task 任务信息
     * @return true 暂停成功
     */
    @Log("定时任务管理——暂停")
    @PostMapping(value = "/pause")
    public HttpResult<Void> pause(@RequestBody SystemTaskEntity task) {
        return new HttpResult<Void>().setSuccess(service.pause(task));
    }

    /**
     * 恢复定时任务
     * @param task 任务信息
     * @return true 恢复成功
     */
    @Log("定时任务管理——恢复")
    @PostMapping(value = "/resume")
    public HttpResult<Void> resume(@RequestBody SystemTaskEntity task) {
        return new HttpResult<Void>().setSuccess(service.resume(task));
    }

    /**
     * 立即执行定时任务
     * @param task 任务信息
     * @return true 任务调用成功
     */
    @Log("定时任务管理——立即执行")
    @PostMapping(value = "/startNow")
    public HttpResult<Void> startNow(@RequestBody SystemTaskEntity task) {
        return new HttpResult<Void>().setSuccess(service.startNow(task));
    }
}
